//
//  Message.h
//  XMPPHelper
//
//  Created by 蔡成汉 on 15/5/7.
//  Copyright (c) 2015年 JW. All rights reserved.
//

#import <Foundation/Foundation.h>

@class Message;

/**
 *  结构体 -- 位置
 */
typedef struct {
    /**
     *  维度
     */
    double latitude;
    
    /**
     *  经度
     */
    double longitude;
}Location;

/**
 *  回执的动作
 */
typedef NS_ENUM(NSInteger, ReceiptAction){
    /**
     *  非聊天界面，仅仅只是接受消息 -- 到达 -- 这个状态需要在进入聊天界面的时候，通知XMPP收消息，动作改变了。
     */
    JustReceive,
    /**
     *  聊天界面，同时接受消息 -- 已读 -- 这个状态需要在进入聊天界面的时候，通知XMPP收消息，动作改变了。
     */
    WithChating
};

//////////////////////////////////////////回执消息///////////////////////////////////////////

@interface ReceiptMessage : NSObject

/**
 *  当前收到的消息 -- 需要将这条消息回执
 */
@property (nonatomic , strong) Message *message;

/**
 *  回执动作 -- 根据这个动作判断对方是“收到”消息还是“已读”消息。
 */
@property (nonatomic , assign) ReceiptAction receiptAction;

/**
 *  将ReceiptMessage转成JSON字符串
 *
 *  @return JSON字符串
 */
-(NSString *)jsonReceiptMessage;

/**
 *  将字典转ReceiptMessage
 *
 *  @param dic 回执消息字典 -- 这个字典为回执消息JSON字符串转化而来
 *
 *  @return 回执消息
 */
+(ReceiptMessage *)receiptMessageWithDic:(NSDictionary *)dic;

@end

//////////////////////////////////////////文本消息///////////////////////////////////////////

@interface TextMessage : NSObject

/**
 *  文本内容
 */
@property (nonatomic , strong) NSString *text;

/**
 *  将TextMessage转成JSON字符串
 *
 *  @return JSON字符串
 */
-(NSString *)jsonTextMessage;

/**
 *  将字典转TextMessage
 *
 *  @param dic 文本消息字典 -- 这个字典为文本消息JSON字符串转化而来
 *
 *  @return 文本消息
 */
+(TextMessage *)textMessageWithDic:(NSDictionary *)dic;

@end

//////////////////////////////////////////图片消息///////////////////////////////////////////

@interface ImageMessage : NSObject

/**
 *  图片本地路径
 */
@property (nonatomic , strong) NSString *path;

/**
 *  图片在服务器上的url
 */
@property (nonatomic , strong) NSString *url;

/**
 *  图片的宽
 */
@property (nonatomic , assign) float width;

/**
 *  图片的高
 */
@property (nonatomic , assign) float height;

/**
 *  将ImageMessage转成JSON字符串
 *
 *  @return JSON字符串
 */
-(NSString *)jsonImageMessage;

/**
 *  将字典转ImageMessage
 *
 *  @param dic 图片信息字典 -- 这个字典为图片信息JSON字符串转化而来
 *
 *  @return 图片信息
 */
+(ImageMessage *)imageMessageWithDic:(NSDictionary *)dic;

@end

//////////////////////////////////////////音频消息///////////////////////////////////////////

@interface AudioMessage : NSObject

/**
 *  音频文件本地路径
 */
@property (nonatomic , strong) NSString *path;

/**
 *  音频文件在服务器上的url
 */
@property (nonatomic , strong) NSString *url;
/**
 *  音频时长 - 单位为秒
 */
@property (nonatomic , assign) NSInteger length;

/**
 *  将AudioMessage转成JSON字符串
 *
 *  @return JSON字符串
 */
-(NSString *)jsonAudioMessage;

/**
 *  将字典转成AudioMessage
 *
 *  @param dic 音频信息字典 -- 这个字典为音频信息JSON字符串转化而来
 *
 *  @return 音频信息
 */
+(AudioMessage *)audioMessageWithDic:(NSDictionary *)dic;

@end


//////////////////////////////////////////位置消息///////////////////////////////////////////

@interface LocationMessage : NSObject

/**
 *  地址
 */
@property (nonatomic , strong) NSString *address;

/**
 *  城市
 */
@property (nonatomic , strong) NSString *city;

/**
 *  坐标
 */
@property (nonatomic , assign) Location location;

/**
 *  将LocationMessage转成JSON字符串
 *
 *  @return JSON字符串
 */
-(NSString *)jsonLocationMessage;

/**
 *  将字典转成LocationMessage
 *
 *  @param dic 位置信息字典
 *
 *  @return LocationMessage
 */
+(LocationMessage *)locationMessageWithDic:(NSDictionary *)dic;

@end

/**
 *  消息类型
 */
typedef NS_ENUM(NSInteger, Type){
    /**
     *  好友消息 -- 一对一消息
     */
    FriendsMessage = 0,
    /**
     *  聊天室消息 -- 一对多消息
     */
    RoomMessage = 1
};

/**
 *  消息类型
 */
typedef NS_ENUM(NSInteger, MessageType){
    /**
     *  回执消息 -- 对方收到消息，对方读取了消息。
     */
    MessageTypeForReceipt = 0,
    /**
     *  文本
     */
    MessageTypeForText = 1,
    /**
     *  图片
     */
    MessageTypeForImage = 2,
    /**
     *  音频
     */
    MessageTypeForAudio = 3,
    /**
     *  表情
     */
    MessageTypeForExp = 4
};

/**
 *  消息发送状态
 */
typedef NS_ENUM(NSInteger, MessageSendType){
    /**
     *  正在发送中...
     */
    MessageIsSending = 0,
    /**
     *  发送成功
     */
    MessageSendSuccess = 1,
    /**
     *  发送失败
     */
    MessageSendFailed = 2
};

/**
 *  消息读取状态
 */
typedef NS_ENUM(NSInteger, MessageReadType){
    /**
     *  消息被对方收到
     */
    MessageIsAccepted = 0,
    /**
     *  消息已读
     */
    MessageIsRead = 1
};

/**
 *  消息动作
 */
typedef NS_ENUM(NSInteger, MessageActionType){
    /**
     *  发送的消息
     */
    SendMessage = 0,
    /**
     *  接收的消息
     */
    ReceivedMessage = 1
};

@interface Message : NSObject

/**
 *  消息的发送者Id
 */
@property (nonatomic , strong) NSString *fromId;

/**
 *  消息的接收者Id -- 如果是群组消息，则toId为房间号
 */
@property (nonatomic , strong) NSString *toId;

/**
 *  消息的内容 -- 为任意类型，可能为字符串，也可能为图片消息，也么能为位置消息，或者为回执消息
 */
@property (nonatomic) id content;

/**
 *  消息类型 -- 默认为好友消息
 */
@property (nonatomic , assign) Type type;

/**
 *  消息的类型
 */
@property (nonatomic , assign) MessageType messageType;

/**
 *  消息发送状态
 */
@property (nonatomic , assign) MessageSendType sendType;

/**
 *  消息读取状态
 */
@property (nonatomic , assign) MessageReadType readType;

/**
 *  消息发送时间
 */
@property (nonatomic , strong) NSString *sendTime;

/**
 *  消息接收时间
 */
@property (nonatomic , strong) NSString *recivedTime;

/**
 *  消息的动作 -- 发送的消息、接收的消息
 */
@property (nonatomic , assign) MessageActionType messageActionType;

/**
 *  将消息转成JSON字符串
 *
 *  @return JSON字符串
 */
-(NSString *)jsonMessage;

/**
 *  将字典转消息 -- 因为XMPP收到的消息为一个JS字符串，JS字符串需要转字典，而字典需要转Message。
 *
 *  @param dic 消息字典
 *
 *  @return Message
 */
+(Message *)messageWithDic:(NSDictionary *)dic;

#pragma mark - FMDB

/**
 *  存储消息
 *
 *  @param message 消息
 */
-(BOOL)saveMessage:(Message *)message;

@end
